package util.android.form.respuesta;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.androidutil.R;

import util.android.ViewUtil;
import util.android.adapters.ItemSpinnerAdapter;
import util.android.beans.Item;
import util.android.form.ContenedorInvisibleView;
import util.android.form.respuesta.EditTextInputGroup.Params;
import util.form.respuesta.listener.OnCambioValor1Listener;
import android.content.Context;
import android.view.View;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;

public class CheckGroupInput
extends AbstractSelectButtonInputAndroid<CheckGroupInput,CheckBox>
{
	private Iterator<CheckBox> it;
	private SpinnerInput spnInput;
	
	private CheckBoxInput cbiSeleccionado;
	private final Map<String,CheckBoxInput> cbInputs;
	private boolean modoExclusivo = false;

	public CheckGroupInput(LinearLayout viewGroup) {
		super(viewGroup,CheckBox.class);
		it = null;
		cbInputs = new HashMap<String,CheckBoxInput>();
	}
	
	@Override
	protected void setRequeridoSubInputs(boolean requerido) {
		if(spnInput!=null)
			spnInput.setRequerido(requerido);
	}
	
	@Override
	protected void setRelevanciaSubInputs(boolean relevancia) {
		super.setRelevanciaSubInputs(relevancia);
		
		if(relevancia) {
			//arreglando la relevancia de los Inputs Otro
			for(CheckBox b : bMap.values()) {
				setRelevanciaInputOtro(b, b.isChecked());
			}
		}
	}
	
	@Override
	protected CheckBox newButton(Context context) {
		return new CheckBox(context);
	}

	@Override
	public String getValor() {
		StringBuilder sb = new StringBuilder();
		for(CheckBox b : bMap.values()) {
			if(b.isChecked()) {
				String key = (String) b.getTag();
				sb.append(key);
			}
		}
		
		//AndroidUtil.mostrarToast(this.getView().getContext(), "VALOR="+sb.toString());		
		if(sb.length()>0)
			return sb.toString();
		
		return null;
	}
	
	@Override
	protected void soloSetValor(String valor) {
		
	}

	/*
	@Override
	protected boolean isButton(View v) {
		return v instanceof CheckBox;
	}
	*/

	
	/**
	 * Registra un CheckBox del ViewGroup. Si ya se registraron todos, entonces este metodo no hace nada.
	 * @param editTextParams
	 * @return
	 * @throws Exception 
	 */
	public CheckGroupInput agregarFromViewGroup(String key, String etiqueta, CheckBoxInputCommand buttonCommand, Params editTextParams, EditTextInputCommand editTextCommand) throws Exception {
		if(it==null) {
			List<CheckBox> hijos  = ViewUtil.getAllChildren(this.view,CheckBox.class);
			it = hijos.iterator();
		}
		
		if(it.hasNext()) {
			CheckBox cb = it.next();
			agregarCheckBox(cb,key,etiqueta,buttonCommand,editTextParams,editTextCommand);
		}
		return this;
	}
	
	@Override
	protected void hacerCheck(CheckBox b) {
		b.setChecked(!b.isChecked());
	}

	@Override
	protected void procesarButtonSeleccionado(CheckBox bSeleccionado) {
		String key = (String) bSeleccionado.getTag();
		this.cbiSeleccionado = cbInputs.get(key);
	}
	
	@Override
	protected void onCambioValor(String valor) throws Exception {
		if(cbiSeleccionado!=null) {
			//CheckBox bSeleccionado = this.cbiSeleccionado.getButton();
			CheckBox bSeleccionado = this.cbiSeleccionado.getView();
		
			if(cbiSeleccionado.isExclusivo()) {
				modoExclusivo = bSeleccionado.isChecked();
				if(modoExclusivo) {
					for(CheckBoxInput in : cbInputs.values()) {
						//CheckBox b = in.getButton();
						CheckBox b = in.getView();
						//if(b.getId()!=bSeleccionado.getId()) {
						if(b!=bSeleccionado) {
							b.setChecked(false);
						}
					}
				}
			}
			else {
				if(modoExclusivo) {
					bSeleccionado.setChecked(false);
				}
			}
			
			setRelevanciaInputOtro(bSeleccionado, bSeleccionado.isChecked());
		}
		
		//SPINNER
		if(spnInput!=null) {
			List<Item> lista = new ArrayList<Item>();
			Item it0 = new Item();					 
			it0.setKey("");
			it0.setLabel("");
			lista.add(it0);
			
			for(CheckBox cb : bMap.values()) {
				if(cb.isChecked()) {
					String key = (String)cb.getTag();
					
					Item it = new Item();					 
					it.setKey(key);
					it.setLabel(etiquetas.get(key));
					lista.add(it);
				}
			}
			
			spnInput.getView().setAdapter(new ItemSpinnerAdapter<Item>(getView().getContext(), lista) {
				
				@Override
				public String getKey(Item obj) {
					return obj.getKey();
				}
				
				@Override
				public String getLabel(Item obj) {
					return obj.getKey()+" "+obj.getLabel();
				}
			});
			
			//Seleccion por defecto
			int n = 2;
			if(lista.size()==n) {
				spnInput.setValor(lista.get(n-1).getKey());
			}
		}
		
		if(valor!=null)
			super.onCambioValor(valor);
	}
	
	private CheckGroupInput agregarCheckBox(
			CheckBox b,
			String key, 
			String etiqueta, 
			CheckBoxInputCommand checkBoxCommand,
			EditTextInputGroup.Params editTextParams,
			EditTextInputCommand editTextCommand) throws Exception {
		agregarButton(b,key,etiqueta,editTextParams,editTextCommand);
		return agregarCheckBoxInput(b,checkBoxCommand);
	}
	
	private CheckGroupInput agregarCheckBox(
			String key, 
			String etiqueta, 
			CheckBoxInputCommand checkBoxCommand,
			EditTextInputGroup.Params editTextParams,
			EditTextInputCommand editTextCommand) throws Exception {
		CheckBox b = agregarButton(key,etiqueta,editTextParams,editTextCommand);
		return agregarCheckBoxInput(b,checkBoxCommand);		
	}
	
	private CheckGroupInput agregarCheckBoxInput(
			CheckBox b,
			CheckBoxInputCommand checkBoxCommand) throws Exception {
		
		final CheckBoxInput in = new CheckBoxInput(b);
		in.setContenedor(new ContenedorInvisibleView(b));		
		//in.setMensajeRequerido("Falta "+buttonParams.nombre);
		
		String v = this.getValorPorDefecto(); 
		if(v!=null && in.getValorPorDefecto()==null) {
			in.setValorPorDefecto(v);
		}
		
		util.form.respuesta.Friend.checkboxinput(in, new OnCambioValor1Listener() {						
			@Override
			public void onCambioValor(String valor) throws Exception {
				//conexion entre CheckBoxInput y CheckGroupInput
				onClick(in.getView());
				
				//Un checkbox comunica el cambio de valor a su contenedor 
				CheckGroupInput.this.onCambioValor(valor);
			}
		});
		
		//in.setNombre(buttonParams.nombre);
		//in.setValorPorDefecto(buttonParams.valorPorDefecto);		
		checkBoxCommand.execute(in);

		String key = (String) b.getTag();
		cbInputs.put(key, in);
		this.getSubInputs().agregar(in);
		return this;
	}
	
	
		
	public final CheckGroupInput agregar(String key, String etiqueta, final String nombreInput) throws Exception {
		CheckBoxInputCommand cbc = new CheckBoxInputCommand() {			
			@Override
			public void execute(CheckBoxInput input) throws Exception {
				input.setNombre(nombreInput);				
			}
		};		
		return agregarCheckBox(key,etiqueta,cbc,null,null);
	}
	
	public final CheckGroupInput agregarOtro(String key, String etiqueta, final String nombreInput, EditTextInputCommand comando) throws Exception {
		Params ep = new Params();
		ep.tipoOtro = EditTextInputGroup.TipoOtro.EDIT_TEXT;
		
		CheckBoxInputCommand cbc = new CheckBoxInputCommand() {			
			@Override
			public void execute(CheckBoxInput input) throws Exception {
				input.setNombre(nombreInput);				
			}
		};
		
		agregarCheckBox(key,etiqueta,cbc,ep,comando);
		return this;
	}
	
	public final CheckGroupInput agregarExclusivo(String key, String etiqueta, final String nombreInput) throws Exception {
		CheckBoxInputCommand cbc = new CheckBoxInputCommand() {			
			@Override
			public void execute(CheckBoxInput input) throws Exception {
				input.setNombre(nombreInput);
				input.setExclusivo(true);
			}
		};		
		return agregarCheckBox(key,etiqueta,cbc,null,null);
	}
	
	/*
	 * Permite seleccionar un item entre los items seleccionados
	 */
	public CheckGroupInput agregarSelectOne(String etiqueta, String nombreInput) throws Exception {
		LinearLayout ly = new LinearLayout(view.getContext());
		ly.setOrientation(LinearLayout.VERTICAL);
		
		TextView tv = (TextView) View.inflate(view.getContext(), R.layout.text_view, null);
		tv.setText(etiqueta);		
		Spinner spn = new Spinner(view.getContext());				
		ly.addView(new TextView(view.getContext()));
		ly.addView(tv);
		ly.addView(spn);
		view.addView(ly);
		
		spnInput = new SpinnerInput(spn);
		
		spnInput.setNombre(nombreInput);
		spnInput.setEtiquetaCorta(etiqueta);
		this.getSubInputs().agregar(spnInput);
		
		return this;
	}

	
	public CheckGroupInput setValorPorDefecto(String valorPorDefecto) {
		for(CheckBoxInput in : cbInputs.values()) {
			in.setValorPorDefecto(valorPorDefecto);
		}
		return super.setValorPorDefecto(valorPorDefecto);
	}



}
